/* 
 * File:   UpgmaAlgorithm.h
 * Author: loskana
 *
 * Created on March 5, 2011, 2:33 PM
 */

#ifndef UPGMAALGORITHM_H
#define	UPGMAALGORITHM_H

#include <string>
#include <vector>
#include <set>

#include "Align.h"
#include "ScoringS2S.h"
#include "SequenceData.h"
#include "NWAlign.h"
#include "AGPFunction.h"

#include "NewickTree.h"

namespace Biopool
{

class UpgmaAlgorithm {

    public:
        UpgmaAlgorithm(std::vector<std::string> &);
        UpgmaAlgorithm(const UpgmaAlgorithm& orig);
        virtual ~UpgmaAlgorithm();

		// TODO: fa ritornare string con serializzazione
        NewickTree execute();

    private:
    
        // vettore delle sequenze di input
        std::vector<std::string> & sequences;
        // matrice (upper, no diagonale) delle distanze delle sequenze
        std::vector<float> distanceMatrix;
        // vettore dei cluster, implementati come set
        std::vector< NewickTree::Node * > clusters;

        // calcola la matrice delle distanze
        void calculateInitialDistanceMatrix();
        // using Align, calcuate distance between two sequence
        float calculateDistance(std::string, std::string);
        // ottiene l'indice delle distanze tra due sequence
        int getDistanceIndex(int, int);
        // cerca i cluster con distanza minima
        void getMinimumDistance(int &, int &, float &);
        // aggiorna i cluster; prende a e b, crea il vettore k che li contiene e lo mette in a, b viene messo a 0
        NewickTree::Node * updateClusters(int, int, float);
        // aggiorna il vettore delle distanze dopo il raggruppamento di cluster
        void updateDistance(int, int);


		// Align parameters
        int distanceGapPenalty;
        int distanceGapExtension;
        
        // Align classes
		SubMatrix * subMatrix;
        AlignmentData * sequenceData;
        GapFunction * gapFunction;
        ScoringScheme * scoringScheme;
        Align * align;
};

} /* namespace */

#endif	/* UPGMAALGORITHM_H */
